package OBS;

import Emailhandler.GmailMailer;
import Databasehandler.DBCommunicator;
import Databasehandler.DBConnector;
import Databasehandler.MySQLCommunicator;
import Errorhandler.ErrorLogger;
import GUI.ShowPopUp;
import java.io.File;

/**
 * Evt. fejl skrives til error log. Dog kan der opstå en fejl der ikke kan
 * logges hvis der ikke er skriverettighed til log bibliotektet. Det er
 * Organisators driftafdelings opgave at sikre at der til enhver tid er skrive-
 * rettighed til log biblioteket. Alternativ kan der skrives til OS event log,
 * det rette sted at angive den kode er markeret med kommentaren
 * SKRIV_TIL_OS_EVENT_LOG. Organisators drift afdeling vælger selv hvilken
 * løsning de foretrækker og står selv for en eventuel implementering.
 * @author Jesper Wistoft
 */
public class SystemMailer {
    GmailMailer gm = new GmailMailer();
    private String logDir = System.getProperty("user.dir") + File.separator+"log"+File.separator;
    private String logName = "SystemMailerErrors.log";

    /**
     * lige nu en tom constructor, det vi ønsker at gøre udføres bedst direkte
     * med metoder. Klassen kan ikke være statisk da den gør brug af GmailMailer
     */
    public void SystemMailer() {

    }
    /**
    * løber subcsriber listen fra customer objektet igennem og udfører
    * sendMail (OBSReportSubscriber) en gang for hver subscriber
    *
    * @param customer angiv hvilken customer subscriber-listen skal tages fra
    */
    public void sendMail (Customer customer) {
        OBSReportSubscriber[] subscribers = customer.getOBSReportSubscribers();
        // 
        for (int i = 0; i < subscribers.length; i++) {
            sendMail(subscribers[i]);
        }
    }
    /**
     * Sender email til en subscriber
     *
     * @param subscriber indeholder den email adresse der skal sendes til
     */
    public void sendMail (OBSReportSubscriber subscriber) {
        // Mailer klassen kræver at modtagerens email-adresser sendes med som et
        // array
        String[] recipients = new String[1];
        recipients[0] = subscriber.getEmail();
        String subject = "Batchkørsels rapport";
        String content = SystemToHTML.generateHTML(subscriber);
        // subscriberID kunne også ligge som et felt, men for læslighedens
        // skyld har jeg valgt at flytte den herned
        int subscriberID = subscriber.getID();
        OBSReportSubscription subscription = subscriber.getOBSReportSubscription();
        BatchReportSystem[] reportSystems = subscription.getBatchReportSystems();
        
        try{
            gm.sendMail(recipients, subject, content);
            // nogle løkker for at nå ned til BatchReportID
            for (int i = 0; i < reportSystems.length; i++) {
                BatchReport[] reports = reportSystems[i].getBatchReports();
                for (int j = 0; j < reports.length; j++)
                    registerMail(subscriberID, "Afsendt korrekt",reports[i].getID());
            }
            ShowPopUp.showMessage("E-mail afsendt");
        }
        catch(Exception ex){
            // nogle løkker for at nå ned til BatchReportID
            for (int i = 0; i < reportSystems.length; i++) {
                BatchReport[] reports = reportSystems[i].getBatchReports();
                for (int j = 0; j < reports.length; j++)
                    registerMail(subscriberID, ex.getMessage(),reports[i].getID());
            }
            ShowPopUp.showMessage("E-mail ikke afsendt. \n Kontakt Driften");
            // send fejlmeddelse til ErrorLog
            try {
                ErrorLogger.writeToErrorLog(logDir+logName,"Programfejl: " + ex.getMessage());
            } catch (Exception ex1){} // fejl hvis der ikke kan skrives til log kan ikke håndteres, SKRIV_TIL_OS_EVENT_LOG
        }
    }
    /**
     * Skriv status for afsendelse af email til OBSReportSendLog
     * 
     * @param subscriberID PK for subscriber
     * @param message status besked der skal skrives
     * @param batchReportID PK for batchReport
     */
    public void registerMail (int subscriberID, String message, int batchReportID) {
        try {
            DBConnector connector = new DBConnector();
            DBCommunicator communicator = new MySQLCommunicator(connector);
            communicator.registerInSendLog(subscriberID, message, batchReportID);
        }
        catch(Exception e) {
            ShowPopUp.showMessage ("Status vedrørende afsendelse af e-mail kunnne ikke registreres i databasen. \n Kontakt driften");
            // send fejlmeddelse til ErrorLog
            try {
                ErrorLogger.writeToErrorLog(logDir+logName,"Programfejl: " + e.getMessage());
            } catch (Exception e1){} // fejl hvis der ikke kan skrives til log kan ikke håndteres, SKRIV_TIL_OS_EVENT_LOG
        }
    }
}
